#include <stdio.h>
#include <sys/types.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <string.h>

#define PROJ_PATH "/home/china"
#define PROJ_ID  115200
/*
    key_t ftok(const char *pathname, int proj_id)：
        指定路径，任意整数id，创建一个唯一key
        只要路径，id相同，那么创建的key就是唯一且相同
    int shmget(key_t key, size_t size, int shmflg)：
        针对key，创建/打开指定大小的共享内存
        返回共享区域id
    void *shmat(int shmid, const void *shmaddr, int shmflg)：
        将内核的共享内存区域映射到进程地址区域，方便在进程中对共享区域进行操作
        参数1，共享内存id
        参数2，共享内存地址，一般填NULL
        参数3，权限，填0（可读可写）
        返回值：共享区域的地址
    int shmdt(const void *shmaddr):
        解映射：
            将进程地址还给内核
*/
int main()
{
    //1.ftok创建一个key
    key_t key = ftok(PROJ_PATH, PROJ_ID);
    if (key == -1)
    {
        perror("ftok error");
        return -1;
    }

    //2.打开或创建共享内存
    int shm_id = shmget(key, 1024, IPC_CREAT | 0777);
    if (shm_id == -1)
    {
        perror("shmget error");
        return -1;
    }

    //3.映射共享内存到用户空间
    char* p = shmat(shm_id, NULL, 0);
    if (p == NULL)
    {
        perror("shmat error");
        return -1;
    }
    char* str = "adcb";
    strcpy(p, str);

    //4.解映射
    shmdt(p);
}